"use strict";
/**
 * public private protected
 *
 * public修饰的属性或者方法是共有的
 *  可以在任何地方被访问到，默认所有的属性或者方法都是public的
 * private修饰的属性或者方法是私有的
 *  不能在声明它的类外面访问
 * protected 修饰的属性是受保护的
 *  它和private类型，但它能在子类中被访问到
 */
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
exports.__esModule = true;
// 创建Person类
var Person = /** @class */ (function () {
    function Person() {
        this.name = "张三";
        this.age = 18;
        this.city = "深圳";
    }
    Person.prototype.say = function () {
        console.log(this.name, this.age);
    };
    return Person;
}());
// 创建Person实例
var p = new Person();
p.say();
// private属性只能在类内部进行访问
// 报错：属性name为私有属性
// console.log(p.name)
// 报错：age受保护，只能在父类及其子类中使用
// console.log(p.age)
console.log(p.city);
// 创建Child子类
var Child = /** @class */ (function (_super) {
    __extends(Child, _super);
    function Child() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    Child.prototype.callParent = function () {
        // 父类将属性定义成私有private，子类不可以进行访问
        // 报错：name为私有属性，只能在person类里使用
        // console.log(super.name)
        // 父类的属性定义成受保护protected，子类可以进行访问
        // 属性用this访问
        console.log(this.age);
        // "super" 访问基类的公共方法和受保护方法
        // super.say()
    };
    Child.prototype.fun = function () {
        console.log(this.city);
        // 报错：找不到名称city
        // console.log(city)
    };
    Child.test = function () {
        console.log("test");
        // 静态方法里，不允许使用this
        // 报错：typeof Child上不存在属性city
        // console.log(this.city)
        // 报错；找不到名称city
        // console.log(city)
    };
    return Child;
}(Person));
var c = new Child();
c.callParent();
// 子类继承了父类，但不能在外部访问受保护的和私有的属性
// console.log(c.age)
// 可以访问父类公开的属性或方法
console.log(c.say);
console.log(Child.test());
